package cn.ainit.sys.utils;

import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;  
import java.io.InputStream;  
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;  
  
import org.apache.commons.net.ftp.FTPClient;  
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;   
  
/** 
 * FTP服务器工具类 
 *    
 */  
public class FTPUtils {  
      
    private static FTPUtils ftpUtils;  
    private static FTPClient ftpClient;  
      
    private static String port; // 服务器端口   
    private static String username; // 用户登录名  
    private static String password; // 用户登录密码  
      
    private InputStream is; // 文件下载输入流  
      
    /** 
     * 私有构造方法 
     */  
    private FTPUtils(String port,String loginName , String pwd) {  
        initConfig(port,loginName,pwd);  
        if (null == ftpClient) {  
            ftpClient = new FTPClient();  
        }  
    }  
  
    /** 
     * 获取FTPUtils对象实例 
     * @return 
     *      FTPUtils对象实例 
     */  
    public synchronized static FTPUtils getInstance (String port,String loginName , String pwd) {  
        if (null == ftpUtils) {  
            ftpUtils = new FTPUtils(port,loginName,pwd);  
        }  
        return ftpUtils;  
    }  
      
    /** 
     * 初始化FTP服务器连接属性 
     */  
    public void initConfig (String port_,String loginName , String pwd) {  
        // 构造Properties对象  
     //   Properties properties = new Properties();  
          
        // 定义配置文件输入流  
        InputStream is = null;  
        try {  
            // 获取配置文件输入流    
        	// is= new FileInputStream("/WEB-INF/userCon/ftp.properties");
          //   is = FTPUtils.class.getResourceAsStream("../WebRoot/WEB-INF/userCon/ftp.properties"); 
        	 
       //      is = FTPUtils.class.getResourceAsStream("/config/sys/ftp.properties");  
       
             // 加载配置文件  /dkpub/src/config/sys/ftp.properties
        //    properties.load(is);  
            // 读取配置文件  
        	port = port_; // 设置端口  
            username = loginName; // 设置用户名  
            password = pwd; // 设置密码  
        } catch (Exception e) {  
            e.printStackTrace();  
        } finally {  
            // 判断输入流是否为空  
            if (null != is) {  
                try {  
                    // 关闭输入流  
                	is.close();  
                } catch (IOException e) {  
                    e.printStackTrace();  
                }  
            }  
        }  
    }  
      
    /** 
     * 连接（配置通用连接属性）至服务器 
     *  
     * @param serverName 
     *      服务器名称 
     * @param remotePath 
     *      当前访问目录 
     * @return 
     *      <b>true</b>：连接成功 
     *      <br/> 
     *      <b>false</b>：连接失败 
     */  
    public static boolean connectToTheServer (String serverName, String remotePath) {  
    	// 定义返回值  
        boolean result = false;  
        try {  
        	  // 设置字符编码  
            ftpClient.setControlEncoding("UTF-8"); 
            // 连接至服务器，端口默认为21时，可直接通过URL连接  
            ftpClient.connect(serverName, Integer.parseInt(port)); 
            // 登录服务器  
            result = ftpClient.login(username, password);  
            if(!result)
            {
            	return result;
            }
            
            // 判断返回码是否合法  
            if (!FTPReply.isPositiveCompletion(ftpClient.getReplyCode())) {  
                // 不合法时断开连接  
                ftpClient.disconnect();  
                // 结束程序  
                return result;  
            }  
            // 设置文件操作目录  
            result = ftpClient.changeWorkingDirectory(remotePath);  
            // 设置文件类型，二进制  
            result = ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);  
            // 设置缓冲区大小  
            ftpClient.setBufferSize(3072);  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
        System.out.println("连接地址:"+serverName+"当前访问目录:"+remotePath+"是否连接:"+result);
        return result;  
    }  
      
    /** 
     * 上传文件至FTP服务器 
     *  
     * @param serverName 
     *      服务器名称 
     * @param storePath 
     *      上传文件存储路径 
     * @param fileName 
     *      上传文件存储名称 
     * @param is 
     *      上传文件输入流 
     * @return 
     *      <b>true</b>：上传成功 
     *      <br/> 
     *      <b>false</b>：上传失败 
     */  
    public static boolean storeFile (String serverName, String storePath, String fileName, InputStream is) {  
    	boolean result = false;  
        try {  
            // 连接至服务器  
            result = connectToTheServer(serverName, storePath);  
            // 判断服务器是否连接成功  
            if (result) {  
                // 上传文件  
                result = ftpClient.storeFile(fileName, is);  
            }  
            // 关闭输入流  
            is.close();  
        } catch (IOException e) {  
            e.printStackTrace();  
        } finally {  
            // 判断输入流是否存在  
            if (null != is) {  
                try {  
                    // 关闭输入流  
                    is.close();  
                } catch (IOException e) {  
                    e.printStackTrace();  
                }  
            }  
            // 登出服务器并断开连接  
            ftpUtils.logout();  
        }  
        return result;  
    }  
      
    /** 
     * 下载FTP服务器文件至本地<br/> 
     * 操作完成后需调用logout方法与服务器断开连接 
     *  
     * @param serverName 
     *      服务器名称 
     * @param remotePath 
     *      下载文件存储路径 
     * @param fileName 
     *      下载文件存储名称 
     * @return 
     *      <b>InputStream</b>：文件输入流 
     */  
    public InputStream retrieveFile (String serverName, String remotePath, String fileName) {  
        try {  
            boolean result = false;  
            // 连接至服务器  
            result = connectToTheServer(serverName, remotePath);  
            // 判断服务器是否连接成功  
            if (result) {  
                // 获取文件输入流  
                is = ftpClient.retrieveFileStream(fileName);  
            }  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
        return is;  
    }  
    /**
     * 返回FTP目录下的文件列表
     * 
     * @param ftpDirectory
     * @return
     */
    public List<String> getFileNameList(String ftpDirectory) {
        List<String> list = new ArrayList<String>();
        try {
        	String[] file  = ftpClient.listNames(ftpDirectory);
        	 for(String f:file){
        		 //验证文件名称
        		 
        		 //若合法则添加到list
        		 list.add(f);
        	 }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return list;
    }
      
    /** 
     * 删除FTP服务器文件 
     *  
     * @param serverName 
     *      服务器名称 
     * @param remotePath 
     *      当前访问目录 
     * @param fileName 
     *      文件存储名称 
     * @return 
     *      <b>true</b>：删除成功 
     *      <br/> 
     *      <b>false</b>：删除失败 
     */  
    public boolean deleteFile (String serverName, String remotePath, String fileName) {  
        boolean result = false;  
        // 连接至服务器  
        result = connectToTheServer(serverName, remotePath);  
        // 判断服务器是否连接成功  
        if (result) {  
            try {  
                // 删除文件  
                result = ftpClient.deleteFile(fileName);  
            } catch (IOException e) {  
                e.printStackTrace();  
            } finally {  
                // 登出服务器并断开连接  
                ftpUtils.logout();  
            }  
        }  
        return result;  
    }  
      
    /** 
     * 检测FTP服务器文件是否存在 
     *  
     * @param serverName 
     *      服务器名称 
     * @param remotePath 
     *      检测文件存储路径 
     * @param fileName 
     *      检测文件存储名称 
     * @return 
     *      <b>true</b>：文件存在 
     *      <br/> 
     *      <b>false</b>：文件不存在 
     */  
    public boolean checkFile (String serverName, String remotePath, String fileName) {  
        boolean result = false;  
        try {  
            // 连接至服务器  
            result = connectToTheServer(serverName, remotePath);  
            // 判断服务器是否连接成功  
            if (result) {  
                // 默认文件不存在  
                result = false;  
                // 获取文件操作目录下所有文件名称  
                String[] remoteNames = ftpClient.listNames();  
                // 循环比对文件名称，判断是否含有当前要下载的文件名  
                for (String remoteName: remoteNames) {  
                    if (fileName.equals(remoteName)) {  
                        result = true;  
                    }  
                }  
            }  
        } catch (IOException e) {  
            e.printStackTrace();  
        } finally {  
            // 登出服务器并断开连接  
            ftpUtils.logout();  
        }  
        return result;  
    }  
  
    /** 
     * 登出服务器并断开连接 
     *  
     * @param ftp 
     *      FTPClient对象实例 
      * @return 
     *      <b>true</b>：操作成功 
     *      <br/> 
     *      <b>false</b>：操作失败 
     */  
    public boolean logout () {  
        boolean result = false;  
        if (null != is) {  
            try {  
                // 关闭输入流  
                is.close();  
            } catch (IOException e) {  
                e.printStackTrace();  
            }  
        }  
        if (null != ftpClient) {  
            try {  
                // 登出服务器  
                result = ftpClient.logout();  
            } catch (IOException e) {  
                e.printStackTrace();  
            } finally {  
                // 判断连接是否存在  
                if (ftpClient.isConnected()) {
                    try {  
                        // 断开连接  
                        ftpClient.disconnect();  
                    } catch (IOException e) {  
                        e.printStackTrace();  
                    }  
                }  
            }  
        }  
        return result;  
    }  
      
}  